其他
ggplot2的3维画图时代
还记得我写的《用ggplot2画3D》一文吗?里面讲述了画3D的奥秘,其实是一种视觉上的欺骗,首先需要定义一个函数去做2D到3D的坐标轴转换,然后就可以画图了。
这种思路现在已经有人去写包实现了,两个包threed
和ggthreed
,第一个包负责做坐标轴的转换,第二个包提供一些图层,方便我们直接ggplot
出3维图,目前这个包只提供了geom_threedpie
一个图层,可以期待以后出更多的图层,现在其实你还是得《用ggplot2画3D》一样的思路。
安装
devtools::install_github("coolbutuseless/threed")
devtools::install_github("coolbutuseless/ggthreed")
3维的饼图
library(ggplot2)
library(ggthreed)
ggplot(mtcars) +
geom_threedpie(aes(x = as.factor(cyl))) +
theme_void() +
theme(legend.position = 'bottom')
还记得我之前画的小兔子么?
和之前《用ggplot2画3D》思路一样,用threed
包来做坐标轴转换,然后3D当2D来画。下面给出了茶壶的代码,可以看做是《没有金刚钻,揽不了瓷器活!》的3D版本。有兴趣的小伙伴还可以尝试画《3D版邪恶的曲线》
library(threed)
camera_to_world <- look_at_matrix(eye = c(1.5, 1.75, 4), at = c(0, 0, 0))
obj <- threed::mesh3dobj$teapot %>%
transform_by(invert_matrix(camera_to_world)) %>%
perspective_projection()
ggplot(obj, aes(x, y, group = zorder)) +
geom_polygon(aes(fill = zorder, colour = zorder)) +
theme_minimal() +
theme(
legend.position = 'none',
axis.text = element_blank()
) +
coord_equal() +
scale_fill_viridis_d (option = 'A') +
scale_color_viridis_d(option = 'A')
往期精彩